/*
************************************************************
*
*   CONTROLLER DE LA VUE PRINCIPALE (FRONT)
*
************************************************************
*/

//TODO terminer la gestion de l'ouverture et de la fermeture + modification de la hauteur de la vue (canvas)
//TODO enregistrer la saisie du commentaire et base SANS LES ACCENTS

package controlers
{
    import events.SillajConnectionEvent;
    import events.SillajEvent;
    
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    
    import models.SillajModel;
    
    import mx.collections.ArrayCollection;
    import mx.events.ListEvent;
    
    import utils.Notifieur;
    
    import views.FrontView;
    
    public class FrontController 
    {
        
        
        private var view:FrontView ;
        
        private var model:SillajModel ;
        
        /*permet la mise à jour de l'affichage du chrono*/        
        private var timer:Timer ;
        
        /*permet d'afficher le chrono getTime( )*/
        private var dateStart:Date ;
        
        /*permet de poursuivre le chrono*/
        private var isPaused:Boolean ;

        /**
        * constructeur
        */ 
        public function FrontController( view:FrontView )
        {
            this.view = view ;
            
            model = new SillajModel( ) ;
            
            /*on cache les fleches des erreurs*/
            view.imgArrowProject.visible = false ;
            view.imgArrowTask.visible    = false ;
            
            timer = new Timer( 100 ) ;
            
            isPaused = false ;
            
            addListeners( ) ;
        }
        
        /**
        * ajoute les écouteurs à la vue
        */
        private function addListeners( ):void
        {
            Notifieur.getInstance().addEventListener( SillajConnectionEvent.LOGIN_SUCCESS, notifieur_logged ) ;
            
            timer.addEventListener( TimerEvent.TIMER, timer_timerHandler ) ;
            
            view.cbox_projects.addEventListener( ListEvent.CHANGE, cbox_projects_changeHandler ) ;  
            view.bt_valid.addEventListener( MouseEvent.CLICK, bt_valid_clickHandler ) ;  
            
            view.bt_reset.addEventListener( MouseEvent.CLICK, bt_reset_clickHandler ) ;
            
            view.bt_play.addEventListener( MouseEvent.CLICK, bt_play_clickHandler ) ;
            view.bt_pause.addEventListener( MouseEvent.CLICK, bt_pause_clickHandler ) ;
            
            view.bt_option.addEventListener( MouseEvent.CLICK, bt_option_clickHandler ) ;
            
            view.frontBg.addEventListener( MouseEvent.MOUSE_DOWN, frontBg_mouseDownHandler ) ;
            
            view.bt_comment.addEventListener( MouseEvent.CLICK, bt_comment_clickHandler ) ;
        }        
        
        /**
        * l'application est connectée à sillaj, on charge les projets
        */
        private function notifieur_logged( e:SillajConnectionEvent ):void
        {
            model.user                = e.sillajUser ;
            model.password        = e.sillajPassword ;
            model.urlSillajFolder = e.sillajURL ;
            
            getProjects( ) ;
        }         
        
        
        /**
        * changement de projet dans la liste
        * chargement des activitées correspondantes
        */ 
        private function cbox_projects_changeHandler( e:ListEvent ):void
        {
            trace(" > cbox_projects_changeHandler" ) ;
            trace( "id project : " +  e.target.selectedItem.id ) ;
         
            model.addEventListener( SillajEvent.COMPLETE, getTask_completeHandler ) ;
            model.getTask( e.target.selectedItem ) ;
        }
        
        /**
        * charge la combobox des task du project selectionné
        */ 
        private function getTask_completeHandler( e:SillajEvent ):void
        {
            e.target.removeEventListener( SillajEvent.COMPLETE, getTask_completeHandler  ) ;
            view.cbox_task.dataProvider = e.arListe  ;
        }              
        
/**
 * debug affiche la liste des objets du dataprovider de la combo task
 */         
private function getArrayCollectionObjects( ):void
{
    var arCol:ArrayCollection = ArrayCollection( view.cbox_task.dataProvider ) ;
    
    var len:uint = arCol.length ;
    
    for ( var i:uint = 0 ; i < len ; i ++ )
    {
        for( var prop:String in arCol[i] )
        {
            trace( prop + " : " + arCol[i][prop] ) ;
        }
    }
                 
       
}
        
                /**
        * on demande l'affichage de la vue option
        */ 
        private function bt_option_clickHandler( e:MouseEvent ):void
        {
            Notifieur.getInstance().dispatchEvent( new Event( "showOption" ) ) ;   
        }    
        
        
        /**
        * charge la liste des projets
        */ 
        private function getProjects( ):void
        {
            trace("getProjects" ) ;
            model.addEventListener( SillajEvent.COMPLETE, getProjects_completeHandler ) ;
            model.getProject( ) ;
        }
        
        /**
        * liste des projets récupérée, affichage dans la vue
        * remet éventuellement à vide la liste des taches
        */ 
        private function getProjects_completeHandler( e:SillajEvent ):void
        {
            trace("getProjects_completeHandler" );
            e.target.removeEventListener( SillajEvent.COMPLETE, getProjects_completeHandler ) ;

            view.cbox_projects.prompt = "Choose your project" ;
            view.cbox_projects.dataProvider = e.arListe  ;
            
            view.cbox_task.dataProvider = null ;
        }        
        
        /**
        * bouton cancel, vide les champs
        */ 
        private function bt_reset_clickHandler( e:MouseEvent ):void
        {
            timer.stop( ) ;
            timer.reset( ) ;
            
            isPaused = false ;
            
            view.labelTimer.text = "00:00:00"  ;
            view.bt_pause.visible = false ;
            view.bt_play.visible    = true ;
            
            view.cbox_projects.selectedIndex = 0 ;
            view.cbox_projects.selectedItem   = null ;
            
            view.cbox_task.selectedIndex = 0 ;
            view.cbox_task.selectedItem   = null ;
            
            view.imgArrowTask.visible = false ;
            view.imgArrowProject.visible = false ;
            
            view.txtComment.text = "" ;
        }
        
        
        /**
        * incrémente le timer
        */
        private function timer_timerHandler( e:TimerEvent ):void
        {
            var dateNow:Date = new Date( ) ;
            var elapseTime:Number = dateNow.getTime( ) - dateStart.getTime( ) ;

            dateNow = new Date( null, null , null , 0,0 ,0 , elapseTime ) ;
            
            view.labelTimer.text = dateNow.toTimeString().substr( 0, 8 ) ;
        } 
        
        
        
        /**
        * lance ou arrête le timer
        */
        private function bt_play_clickHandler( e:MouseEvent ):void
        {
            e.target.visible = false ;
            view.bt_pause.visible = true ;
            
             dateStart = new Date( ) ;    

            /*si on été en pause, on soustrait de la date actuelle les seconds écoulées pour poursuivre le chrono*/            
            if( isPaused )
            {
                var nbSecondeElapse:Number = Number( view.labelTimer.text.substr( 6, 2 ) )  + 
                                                                    Number( view.labelTimer.text.substr( 3, 2 ) ) * 60   + 
                                                                    Number( view.labelTimer.text.substr( 0, 2 ) ) * 3600 ;
                
                dateStart.setTime( dateStart.getTime() - ( nbSecondeElapse * 1000 )  ) ;
            }
            timer.start( ) ;
        } 
        
        private function bt_pause_clickHandler( e:MouseEvent ):void
        {
            e.target.visible = false ;
            view.bt_play.visible = true ;
            timer.stop( ) ;            
            isPaused = true ;
        }
        
        
        /**
        * si toutes les saisies sont OK, enregistre le temps
        */
        private function bt_valid_clickHandler( e:MouseEvent ):void
        {
            view.imgArrowTask.visible = false ;
            view.imgArrowProject.visible = false ;
            
            if( view.labelTimer.text != "00:00:00" && view.labelTimer.text != "saved" )
            {
                if( view.cbox_projects.selectedItem && view.cbox_task.selectedItem )
                {
                    model.addEventListener( SillajEvent.COMPLETE, addTime_completeHandler ) ;
                    
                    //model.addEvent( view.cbox_projects.selectedItem, view.cbox_task.selectedItem, '', '', view.labelTimer.text, '', new Date( ) ) ;
                    model.addEvent( 
                                                view.cbox_projects.selectedItem, 
                                                view.cbox_task.selectedItem, 
                                                '', 
                                                '', 
                                                view.labelTimer.text, 
                                                view.txtComment.text, 
                                                new Date( ) 
                                                ) ;
                }
                else
                {
                    if( view.cbox_projects.selectedItem == null )
                    {
                        view.imgArrowProject.visible = true ;
                    }
                    
                    if( view.cbox_task.selectedItem == null )
                    {
                        view.imgArrowTask.visible = true ;
                    }
                }
            }
            else
            {
                trace( "erreur : aucun temps" ) ;
            }
        } 
        
        
        /**
        * retour de l'enregistrement dans Sillaj
        */
        private function addTime_completeHandler( e:SillajEvent ):void
        {
            model.removeEventListener( SillajEvent.COMPLETE, addTime_completeHandler ) ;
            bt_reset_clickHandler( null ) ;
            view.labelTimer.text = "saved" ;
        } 
        
        
        
        /**
        * previent l'application qu'un début de déplacement est demandé
        */ 
        private function frontBg_mouseDownHandler( e:MouseEvent ):void
        {
            view.dispatchEvent( new Event( "startDrag", true ) ) ;
        }
        
        /**
        * réduit ou ouvre le widget pour les commentaires
        */
        private function bt_comment_clickHandler( e:MouseEvent ):void
        {
            if(  view.currentState == null )
            {
                collapseView( ) ;
            }
            else
            {
                expandView( ) ;
            }
            Notifieur.getInstance().dispatchEvent( new Event( "changeState" ) ) ;
        } 
        
        /**
        * ouvre le widget
        */ 
        private function expandView( ):void
        {
            view.currentState = null ;
        }
        
        /**
        * referme le widget
        */ 
        private function collapseView( ):void
        {
            view.currentState = "upState" ;
        }
                

    }
}